package com.example.codegenerator;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;


import com.baomidou.mybatisplus.core.enums.SqlLike;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.po.LikeTable;
import com.baomidou.mybatisplus.generator.config.rules.DateType;

public class CodeGeneratorApplication {

	public static void main(String[] args) {
		// jdbc配置
		 String url = "jdbc:mysql://127.0.0.1:13306/demo_202201?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8";
		 String user = "root";
		 String pwd = "123456";


		String author = "J.L.Zhou";// 作者
		String outputDir = "/temp/";// 生成目录:当前盘符下的temp目录
		String parent = "com.teach"; // 基础包名

		StringBuilder moduleName = new StringBuilder();

		FastAutoGenerator.create(url, user, pwd)

				// 全局配置
				.globalConfig((scanner, builder) -> {
					moduleName.append(scanner.apply("请输入模块名:"));
					builder
							// .author(scanner.apply("请输入作者名称:"))
							.author(author)
							.dateType(DateType.ONLY_DATE)
							.outputDir(outputDir)
							.commentDate("yyyy-MM-dd HH:mm");

				})
				// 包配置
				.packageConfig((scanner, builder) -> builder
						// .parent(scanner.apply("请输入基础包名"))
						.parent(parent) // 基础包名
						.moduleName(moduleName.toString()) // 模块名
						.controller("api")
				// .pathInfo(Collections.singletonMap(OutputFile.xml, "D://"))//配置输出路径

				)
				// 策略配置
				.strategyConfig((scanner, builder) -> builder
						// .addInclude(getTables(scanner.apply("请输入表名，多个英文逗号分隔？所有输入 all")))
						.likeTable(new LikeTable(moduleName.toString() + "_", SqlLike.RIGHT)) // 模糊匹配 [模块名]_%的表
						.addTablePrefix(moduleName.toString() + "_") //表的前缀(生成时去掉)
						.addTableSuffix("_t") //表的后缀(生成时去掉)

						.controllerBuilder() // 控制器构建配置
						.fileOverride()
						.enableRestStyle() // 控制器是否采用Restful风格
						.enableHyphenStyle() // 是否开启驼峰转连字符(蛇形命名法,url的通用命名规则)
						.formatFileName("%sApi")

						.entityBuilder() // 实体类构建配置
						.fileOverride()
						// .enableLombok() //启动Lombok注解
						.enableTableFieldAnnotation()// 启动表和字段注解

						.serviceBuilder()// 业务逻辑层构建配置
						.fileOverride()
						.formatServiceFileName("%sService")
						.formatServiceImplFileName("%sServiceImpl")

						.mapperBuilder()// Mapper构建配置
						.fileOverride()
						.enableMapperAnnotation()// 开启 @Mapper 注解
						.enableBaseResultMap()// 启用 BaseResultMap 生成
						.enableBaseColumnList()// 启用 BaseColumnList
						.build())
				/*
				 * 模板引擎配置，默认 Velocity 可选模板引擎 Beetl 或 Freemarker
				 * .templateEngine(new BeetlTemplateEngine())
				 * .templateEngine(new FreemarkerTemplateEngine())
				 */
				.execute();
	}

	// 处理 all 情况
	protected static List<String> getTables(String tables) {
		return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
	}
}
